package com.zzyy.dtx.msg.service;

import com.zzyy.dtx.msg.dto.MsgDTO;
import com.zzyy.dtx.msg.entities.Msg;
import com.zzyy.dtx.msg.handle.MsgHandler;
import com.zzyy.dtx.msg.mapper.MsgMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;


@Service
public class MsgService {

    @Resource private MsgHandler msgHandler;//对应设计图第6步用到的。

    @Resource
    private MsgMapper msgMapper;

    private static final Logger LOGGER = LoggerFactory.getLogger(MsgService.class);

    /**
     *设计图第2步，接收"待发送"消息，把消息保持为“待发送”状态
     * @param msgDTO
     */
    @Transactional
    public void prepareMsg(MsgDTO msgDTO)
    {
        Msg msg = new Msg();
        BeanUtils.copyProperties(msgDTO,msg);
        //tx_msg表`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '消息状态 0=待发送 1=已发送 '
        msg.setStatus((byte)0);
        this.msgMapper.insertSelective(msg);
    }

    /**
     * 设计图第5步，确认消息可以发送了，把消息状态改为“已发送”
     * @param msgDTO
     */
    @Transactional
    public void confirmMsg(MsgDTO msgDTO)
    {
        Msg msg = new Msg();
        msg.setMsgId(msgDTO.getMsgId());
        msg = this.msgMapper.selectOne(msg);

        //tx_msg表`status`消息状态 0=待发送 1=已发送 '
        msg.setStatus((byte)1);
        int i = this.msgMapper.updateByPrimaryKeySelective(msg);

        if(i > 0)
        {
            // 对应设计图的第6步骤，确认消息可以发出去给RabbitMQ了，发送消息
            this.msgHandler.send(msg.getRoutingKey(),msg.getJsonMsg());
        }
    }

    @Transactional
    public  void deleteMsg(MsgDTO msgDTO){
        LOGGER.info("delete-msg............"+msgDTO.getMsgId());
        Msg msg=new Msg();
        msg.setMsgId(msgDTO.getMsgId());
        this.msgMapper.delete(msg);
    }

    /**
     * 下面是给定时任务xxl-job配合使用的，不是一键生成的mybatis代码
     *    SELECT * FROM tx_msg m WHERE `status`=#{status}  and TIMESTAMPDIFF(MINUTE,create_time, NOW())>#{time}
     * @param t
     * @return
     */
    public List<Msg> selectOverdueMsgByNotSend(int t){
        return this.msgMapper.selectOverdueMsg(0,t);
    }
    public List<Msg> selectOverdueMsgBySend(int t){
        return this.msgMapper.selectOverdueMsg(1,t);
    }
}

